package com.buba.system.service.Impl;

import com.buba.system.dao.MenuMapper;
import com.buba.system.pojo.Job;
import com.buba.system.pojo.Menu;
import com.buba.system.pojo.Page;
import com.buba.system.service.MenuService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
@DubboService
public class MenuServiceImpl implements MenuService {
    private MenuMapper menuMapper;

    @Override
    public List<Menu> selMenu(Integer jobId) {
        return menuMapper.selMenu(jobId);
    }



    /**
     * 根据职位获得相应菜单
     * @param jobList 职位集合
     * @return 菜单集合
     */
    @Override
    public List<Menu> noDup(List<Job> jobList) {
        //使用Set的特性，去重重复数据  当使用set集合去重时，需要考虑是跟据对象的内容去重还是根据内存地址去重
        //要想根据对象的内容去重，必须给对象重写hashCode() equals()
        //o==o2 比较对象时比较的是该对象所在的内存地址
        Set<Menu> menuSet = new TreeSet<>();
        for(Job job : jobList)
            //遍历该职位所拥有的菜单
            for(Menu menu : job.getMenuList())
                //把菜单放入Set集合中去重
                menuSet.add(menu);
            //menuSet.forEach(System.out::println);
        //System.out.println(menuSet.size());
        //实现菜单的层级效果，用于装入调整好的菜单返回
        List<Menu> menuList = new ArrayList<>();
        // 遍历Set集合
        for (Menu menu : menuSet) {
            // 当菜单的pid是0时，说明该菜单是父级菜单
            // 意味着该菜单下拥有子集菜单
            if (menu.getMenuPid() == 0) {
                // 用于装入子集菜单
                List<Menu> subMenuList = new ArrayList<>();
                // 在遍历Set集合，寻找该菜单下的子集
                for (Menu subMenu : menuSet) {
                    //当子集的Pid等于父级的id时，说明该菜单是它的子集
                    if (subMenu.getMenuPid() == menu.getMenuId())
                        // 把该菜单装入子集集合中
                        subMenuList.add(subMenu);
                }
                // 把该父级菜单的子集集合赋值
                menu.setSubMenu(subMenuList);
                // 当调整好的层级菜单，装入要返回的集合中
                menuList.add(menu);
            }
        }
        return menuList;
    }



    @Override
    public Integer addMenuByJobId(Map<String, Object> map) {
        return menuMapper.addMenuByJobId(map);
    }

    @Override
    public Integer delEmpJobEmId(List<String> list) {
        return menuMapper.delEmpJobEmId(list);
    }

    @Override
    public Integer delMenuByJobId(Integer jobId) {
        return menuMapper.delMenuByJobId(jobId);
    }

    @Override
    public long selMenuCount() {
        return menuMapper.selMenuCount();
    }

    @Override
    public List<Menu> selMenuAll() {
        return menuMapper.selMenuAll();
    }

    @Override
    public List<Menu> selMenuTable(Page<Menu> page) {
        return menuMapper.selMenuTable(page);
    }


    @Autowired
    public void setMenuMapper(MenuMapper menuMapper) {
        this.menuMapper = menuMapper;
    }
}
